package no.ciber.kartdemo.googlemaps;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class LokasjonService {
	private static final String GOOGLE_API_KEY = "ABQIAAAAANXjQjirAhDtMp6PPOEpuRTBPr0qerHOH45at0FWgXhSnhMSWxQJf-0linj_J9ibsf8aC5g1DJr7_w";
	private static final String httpTemplate = "http://maps.google.com/maps/geo?q=%1&output=csv&sensor=false&key=%2";
	private Map<String, Lokasjon> lokasjonCache = new HashMap<String, Lokasjon>();

	public Lokasjon hentLokasjon(String by) {
		if (lokasjonCache.containsKey(by)) {
			return lokasjonCache.get(by);
		}
		Lokasjon lokasjon = hentLokasjonRemote(by);
		if (lokasjon != null) {
			lokasjonCache.put(by, lokasjon);
			return lokasjon;
		}
		return null;
	}

	Lokasjon hentLokasjonRemote(String by) {
		Lokasjon lokasjon = new Lokasjon();
		HttpURLConnection connection = lagConnection(by);
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
				throw new RuntimeException("Fikk " + connection.getResponseCode() + ": " + connection.getResponseMessage() + " . Fra serveren");
			}
			String data = hentUtData(reader);
			String[] split = data.split(",");
			lokasjon.setLatitude(split[2]);
			lokasjon.setLongitude(split[3]);
			lokasjon.setSted(by);
			return lokasjon;
		} catch (Exception e) {
			System.out.println("Noe gikk galt, eller fant ikke posisjon for: " + by);
		}
		return hentLokasjonRemote("Kautokeino");
	}

	private String hentUtData(BufferedReader reader) throws IOException {
		StringBuffer toReturn = new StringBuffer();
		String current;
		while ((current = reader.readLine()) != null) {
			toReturn.append(current);
		}
		return toReturn.toString();
	}

	HttpURLConnection lagConnection(String by) {
		URL url = lagUrl(by);
		try {
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			connection.setRequestMethod("GET");
			connection.setDoOutput(true);
			return connection;
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	URL lagUrl(String by) {

		String urlString = new String(httpTemplate);
		urlString = urlString.replace("%1", by);
		urlString = urlString.replace("%2", GOOGLE_API_KEY);
		try {
			return new URL(urlString);
		} catch (MalformedURLException e) {
			throw new RuntimeException(e);
		}
	}

}
